
import ffmpeg

# 输入文件路径
# print('\nInputFile path: ')
input_file = input('\nInputFile path: ') # '/Users/mac/Desktop/videos/national.treasure.1.avi'

# 输出文件路径
# print('\nOutputFile base name: ')
output_file_base = input('\nOutputFile base name: ') # 'output_cut.mp4'

def time_to_seconds(time_str):
    """
    将类似 '25:00.335' 或 '1:13:01.331' 的时间字符串转换为总秒数（浮点数）
    
    支持格式：
        - 分:秒.毫秒 （MM:SS.sss）
        - 时:分:秒.毫秒 （HH:MM:SS.sss）
    """
    # 拆分成小时、分钟、秒部分
    parts = list(map(float, time_str.split(':')))
    
    # 根据长度判断是 HH:MM:SS.sss 还是 MM:SS.sss
    if len(parts) == 3:
        hours, minutes, seconds = parts
        total_seconds = hours * 3600 + minutes * 60 + seconds
    elif len(parts) == 2:
        minutes, seconds = parts
        total_seconds = minutes * 60 + seconds
    else:
        raise ValueError(f"不支持的时间格式: {time_str}")
    
    return total_seconds

def time_diff_to_formatted_time(start_time_str, end_time_str):
    """
    输入两个类似 "25:00.335" 或 "1:13:01.331" 的时间字符串，
    返回它们之间的时间差，格式仍为相同的时间格式。
    """
    def time_to_seconds(time_str):
        parts = list(map(float, time_str.split(':')))
        if len(parts) == 3:
            h, m, s = parts
            return h * 3600 + m * 60 + s
        elif len(parts) == 2:
            m, s = parts
            return m * 60 + s
        elif len(parts) == 1:
            return parts[0]
        else:
            raise ValueError(f"不支持的时间格式: {time_str}")

    def seconds_to_time(seconds):
        hours = int(seconds // 3600)
        seconds %= 3600
        minutes = int(seconds // 60)
        sec = seconds % 60
        milliseconds = round((sec - int(sec)) * 1000)
        sec = int(sec)

        if hours > 0:
            return f"{hours}:{minutes:02d}:{sec:02d}.{milliseconds:03d}"
        else:
            return f"{minutes}:{sec:02d}.{milliseconds:03d}"

    # 转换为秒
    start_sec = time_to_seconds(start_time_str)
    end_sec = time_to_seconds(end_time_str)

    # 计算差值
    diff_sec = end_sec - start_sec

    # 返回格式化结果
    return seconds_to_time(diff_sec)


def format_time_strict(time_str):
    """
    将类似 '1:13:01.331' 或 '25:00.335' 的时间字符串转换为 'HHMMSS.mmm' 格式。
    支持的输入格式：
        - MM:SS.sss （如 "25:00.335"）
        - HH:MM:SS.sss （如 "1:13:01.331"）
    输出格式：
        - "HHMMSS.mmm"
    """
    # 拆分各部分并转换成浮点数
    parts = list(map(float, time_str.split(':')))
    
    if len(parts) == 3:
        # 格式为 HH:MM:SS.sss
        hours, minutes, seconds = parts
    elif len(parts) == 2:
        # 格式为 MM:SS.sss，小时默认为 0
        minutes, seconds = parts
        hours = 0
    elif len(parts) == 1:
        # 仅秒+毫秒，如 "59.123"
        seconds = parts[0]
        hours = 0
        minutes = 0
    else:
        raise ValueError(f"不支持的时间格式: {time_str}")
    
    # 分离整数秒和毫秒
    total_seconds = float(seconds)
    int_seconds = int(total_seconds)
    milliseconds = round((total_seconds - int_seconds) * 1000)

    # 构造 HHMMSS.mmm 格式
    hh = f"{int(hours):02d}"
    mm = f"{int(minutes):02d}"
    ss = f"{int_seconds:02d}"
    mmm = f"{milliseconds:03d}"

    return f"{hh}{mm}{ss}.{mmm}"


def CutIt(atime, btime, rotation, vflip, keyWords):

    # 开始时间和持续时间
    start_time = time_to_seconds(atime) # 1500.335 # 25:00.335  # 开始时间，单位秒
    duration = time_diff_to_formatted_time(atime, btime) # 25:14.435 # 持续时间，单位秒

    # 使用 ffmpeg.input 加载输入文件，并指定开始时间和持续时间
    stream = ffmpeg.input(input_file, ss=start_time, t=duration)

    output_file = ''
    if keyWords == None or str.replace(keyWords,' ','') == '':
        output_file = output_file_base + '-' + format_time_strict(atime) + '-' + format_time_strict(btime) + '.mp4'
    else:
        output_file = output_file_base + '-' + format_time_strict(atime) + '-' + keyWords + '.mp4'
    
    # # 使用 ffmpeg.output 设置输出，并添加编码参数
    if rotation == 0 and vflip == False: # 不旋转, 也不垂直翻转时

        # 不用分割音视频, 直接处理
        stream = ffmpeg.output(stream, output_file, vcodec='libx264', acodec='aac')

    else :
        video = stream.video

        if rotation != 0:

            # 对视频流应用 transpose 滤镜进行90度旋转
            # transpose=1 表示顺时针旋转90度
            # 如果需要逆时针旋转90度，可以使用 transpose=2
            # transpose=0: 逆时针旋转90度，并垂直翻转。
            # transpose=1: 顺时针旋转90度（默认）。
            # transpose=2: 逆时针旋转90度。
            # transpose=3: 顺时针旋转90度，并垂直翻转。
            # video = stream.video.filter_('transpose', 2)
            video = video.filter_('transpose', rotation)
            # stream = ffmpeg.output(video, stream.audio, output_file, vcodec='libx264', acodec='aac')

        if vflip == True:

            # 获取视频流并应用 vflip 滤镜进行垂直翻转
            video = video.filter_('vflip')

        # 合并处理后的视频流和原始音频流
        stream = ffmpeg.output(video, stream.audio, output_file, vcodec='libx264', acodec='aac')
        

    # 打印对应的 FFmpeg 命令（可选）
    print(ffmpeg.compile(stream))

    # 开始执行转码和剪切
    ffmpeg.run(stream)


    # 对有旋转的, 进行水平镜像处理后 再 多生成一份视频
    if rotation != 0 :

        output_file_hflip = output_file_base + '-' + format_time_strict(atime) + '-' + format_time_strict(btime) + '-hflip.mp4' 
        stream = ffmpeg.input(input_file, ss=start_time, t=duration)
        video = stream.video


        # 对视频流应用 transpose 滤镜进行90度旋转
        # transpose=1 表示顺时针旋转90度
        # 如果需要逆时针旋转90度，可以使用 transpose=2
        # transpose=0: 逆时针旋转90度，并垂直翻转。
        # transpose=1: 顺时针旋转90度（默认）。
        # transpose=2: 逆时针旋转90度。
        # transpose=3: 顺时针旋转90度，并垂直翻转。
        # video = stream.video.filter_('transpose', 2)
        video = video.filter_('transpose', rotation)

        if vflip == True:

            # 获取视频流并应用 vflip 滤镜进行垂直翻转
            video = video.filter_('vflip')

        
        video = video.filter_('hflip')

        # 合并处理后的视频流和原始音频流
        stream = ffmpeg.output(video, stream.audio, output_file_hflip, vcodec='libx264', acodec='aac')
        

        # 打印对应的 FFmpeg 命令（可选）
        print(ffmpeg.compile(stream))

        # 开始执行转码和剪切
        ffmpeg.run(stream)


# CutIt('1:01:45.583', '1:01:52.506')